<?php

namespace magein\utils;

/**
 * 一些常用的验证类
 */
class Validator
{
    /**
     * 验证手机
     * @param string $number
     * @return bool
     */
    public static function phone(string $number): bool
    {
        if (preg_match('/^1[3-9]\d{9}$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证邮箱
     * @param string $number
     * @return bool
     */
    public static function email(string $number): bool
    {
        if (preg_match('/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证qq号码
     * @param string|int $number
     * @return bool
     */
    public static function qq($number): bool
    {
        if (preg_match('/^\d{4,}$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证身份证
     * @param string|int $number
     * @return bool
     */
    public static function idCard($number): bool
    {
        if (preg_match('/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * url地址
     * @param string $number
     * @return bool
     */
    public static function url(string $number): bool
    {
        if (preg_match('/^(http|https):\/\/([^:\/]+)(?::(\d+))?(\/.*)?$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证是否是https
     * @param string $number
     * @return bool
     */
    public static function https(string $number): bool
    {
        if (preg_match('/^https:\/\/([^:\/]+)(?::(\d+))?(\/.*)?$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证是否是http
     * @param string $number
     * @return bool
     */
    public static function http(string $number): bool
    {
        if (preg_match('/^http:\/\/([^:\/]+)(?::(\d+))?(\/.*)?$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 是否是ip地址
     * @param string $number
     * @return bool
     */
    public static function ip(string $number): bool
    {
        if (self::ipv4($number)) {
            return true;
        }

        if (self::ipv6($number)) {
            return true;
        }

        return false;
    }

    /**
     * 验证是否是ipv4
     * @param string $number
     * @return bool
     */
    public static function ipv4(string $number): bool
    {
        if (preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证是否是ipv6
     * @param string $number
     * @return bool
     */
    public static function ipv6(string $number): bool
    {
        if (preg_match('/^([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}$/', $number)) {
            return true;
        }
        return false;
    }

    /**
     * 验证是否是图片地址
     * 传递的是一个url 则自动获取格式，如果传递的是extension，则直接验证
     * @param string $url
     * @return bool
     */
    public static function image(string $url): bool
    {
        $ext = strtolower(pathinfo($url, PATHINFO_EXTENSION));

        if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])) {
            return true;
        }

        return false;
    }

    /**
     * 匹配汉字
     * @param string $char
     * @param array $length
     * @return bool
     */
    public static function chinese(string $char, array $length = []): bool
    {
        $min = $length[0] ?? 2;
        $max = $length[1] ?? 6;

        if (preg_match('/^[\x{4e00}-\x{9fa5}]{' . $min . ',' . $max . '}$/u', $char)) {
            return true;
        }
        return false;
    }
}